/// # MBR 分区记录
///
/// MBR 中包含 4 个分区记录，每一个记录都定义了硬盘分区的起始位置和结束位置（LBA: 逻辑块地址）
#[repr(C)]
pub struct MbrPartitionRecord {
    /// 如果值为 0x80 则表示该分区是一个可启动的传统分区。
    /// 其他值表示该分区不可启动。
    ///
    /// 该字段不会被 UEFI 固件使用。
    pub boot_indicator: u8,
    /// 分区的起始地址（CHS 格式）
    pub starting_chs: Chs,
    /// 分区类型
    ///
    /// + 0xEF：UEFI 系统分区
    /// + 0xEE：GPT 保护分区
    pub os_type: u8,
    /// 分区的结束地址（CHS 格式）
    pub ending_chs: Chs,
    /// 分区在硬盘上的逻辑块起始地址。
    /// 该字段会被 UEFI 固件用来确定分区的起始位置。
    pub starting_lba: [u8; 4],
    /// 分区的大小，以逻辑块为单位。
    /// 该字段被 UEFI 固件用来决定分区的大小。
    pub size_in_lba: [u8; 4],
}

#[repr(C)]
pub struct Chs {
    pub head: u8,
    pub sector: u8,
    pub track: u8,
}

/// # Legacy Master Boot Record (MBR)
///
/// 如果不适用 GPT 硬盘布局，传统 MBR 永远位于 LBA 0（也就是硬盘的第一个逻辑块）。
/// UEFI 固件不会执行 MBR 中的启动代码。
#[repr(C)]
pub struct MasterBootRecord {
    /// 包含非 UEFI 系统中使用的 x86 代码，用来选择一个 MBR 分区记录
    /// 并加载该分区的第一个逻辑块。
    ///
    /// 该代码不会在 UEFI 系统中执行。
    pub boot_strap_code: [u8; 440],

    /// 硬盘签字，用来区分不同的硬盘。由操作系统负责向其中写入签字的值。
    pub unique_mbr_disk_signature: [u8; 4],

    _unknown: [u8; 2],

    /// 一个包含了 4 个传统 MBR 分区记录的数组。
    pub partition_record: [MbrPartitionRecord; 4],

    /// 永远为 0xAA55：第一个字节为 0x55，第二个字节为 0xAA。
    pub signature: u16,
}
